/*
 *	ApOS (Another Project software for s3c2410)
 *	
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License version 2 as
 *	published by the Free Software Foundation.
 *			
 *
 */
#include "typedef.h"
#define EI_MAG0 	0	//File identification
#define EI_MAG1		1	//File identification
#define EI_MAG2 	2	//File identification
#define EI_MAG3 	3	//File identification
#define EI_CLASS	4	//File class
#define EI_DATA 	5	//Data encoding
#define EI_VERSION 	6	//File version
#define EI_OSABI 	7	//Operating system/ABI identification
#define EI_ABIVERSION 	8	//ABI version
#define EI_PAD 		9	//Start of padding bytes
#define EI_NIDENT 	16	//Size of e_ident[]

//e_ident[EI_CLASS]
#define ELFCLASSNONE 	0 	//Invalid class
#define ELFCLASS32 	1 	//32-bit objects
#define ELFCLASS64 	2 	//64-bit objects

//e_ident[EI_DATA]
#define ELFDATANONE 	0	//Invalid data encoding
#define ELFDATA2LSB 	1	//little endian
#define ELFDATA2MSB 	2	//big endian

//e_type
#define ET_NONE		0	//No file type
#define ET_REL 		1	//Relocatable file
#define ET_EXEC		2	//Executable file
#define ET_DYN		3	//Shared object file
#define ET_CORE		4	//Core file
#define ET_LOOS		0xfe00	//Operating system-specific
#define ET_HIOS		0xfeff	//Operating system-specific
#define ET_LOPROC	0xff00	//Processor-specific
#define ET_HIPROC	0xffff	//Processor-specific

//e_machine
#define EM_NONE		0	//No machine
#define EM_M32		1	//AT&T WE 32100
#define EM_SPARC	2	//SPARC
#define EM_386		3	//Intel 80386
#define EM_68K		4	//Motorola 68000
#define EM_88K		5 	//Motorola 88000
#define RESERVED1	6	//Reserved for future use
#define EM_860		7	//Intel 80860
#define EM_MIPS		8	//MIPS I Architecture
#define EM_S370		9	//IBM System/370 Processor
#define EM_MIPS_RS3_LE 	10	//MIPS RS3000 Little-endian
//11-14 Reserved for future use
#define EM_PARISC	15	//Hewlett-Packard PA-RISC
#define RESERVED2	16	//Reserved for future use
#define EM_VPP500	17	//Fujitsu VPP500
#define EM_SPARC32PLUS	18	//Enhanced instruction set SPARC
#define EM_960		19	//Intel 80960
#define EM_PPC		20	//PowerPC
#define EM_PPC64	21	//64-bit PowerPC
//22-35 Reserved for future use
#define EM_V800		36	//NEC V800
#define EM_FR20		37	//Fujitsu FR20
#define EM_RH32		38	//TRW RH-32
#define EM_RCE		39	//Motorola RCE
#define EM_ARM		40	//Advanced RISC Machines ARM
#define EM_ALPHA	41	//Digital Alpha
#define EM_SH		42	//Hitachi SH
#define EM_SPARCV9	43	//SPARC Version 9
#define EM_TRICORE	44	//Siemens Tricore embedded processor
#define EM_ARC		45	//Argonaut RISC Core, Argonaut Technologies Inc.
#define EM_H8_300	46	//Hitachi H8/300
#define EM_H8_300H	47	//Hitachi H8/300H
#define EM_H8S		48	//Hitachi H8S
#define EM_H8_500	49	//Hitachi H8/500
#define EM_IA_64	50	//Intel IA-64 processor architecture
#define EM_MIPS_X	51	//Stanford MIPS-X
#define EM_COLDFIRE	52	//Motorola ColdFire
#define EM_68HC12	53	//Motorola M68HC12
#define EM_MMA		54	//Fujitsu MMA Multimedia Accelerator
#define EM_PCP		55	//Siemens PCP
#define EM_NCPU		56	//Sony nCPU embedded RISC processor
#define EM_NDR1		57	//Denso NDR1 microprocessor
#define EM_STARCORE	58	//Motorola Star*Core processor
#define EM_ME16		59	//Toyota ME16 processor
#define EM_ST100	60	//STMicroelectronics ST100 processor
#define EM_TINYJ	61	// Advanced Logic Corp. TinyJ embedded processor family
//62-65 Reserved for future use
#define EM_FX66		66	//Siemens FX66 microcontroller
#define EM_ST9PLUS	67	//STMicroelectronics ST9+ 8/16 bit microcontroller
#define EM_ST7		68	//STMicroelectronics ST7 8-bit microcontroller
#define EM_68HC16	69	//Motorola MC68HC16 Microcontroller
#define EM_68HC11	70	//Motorola MC68HC11 Microcontroller
#define EM_68HC08	71	//Motorola MC68HC08 Microcontroller
#define EM_68HC05	72	//Motorola MC68HC05 Microcontroller
#define EM_SVX		73	//Silicon Graphics SVx
#define EM_ST19		74	//STMicroelectronics ST19 8-bit microcontroller
#define EM_VAX		75	//Digital VAX
#define EM_CRIS		76	//Axis Communications 32-bit embedded processor
#define EM_JAVELIN	77	//Infineon Technologies 32-bit embedded processor
#define EM_FIREPATH	78	//Element 14 64-bit DSP Processor
#define EM_ZSP		79	//LSI Logic 16-bit DSP Processor
#define EM_MMIX		80	//Donald Knuth's educational 64-bit processor
#define EM_HUANY	81	//Harvard University machine-independent object files
#define EM_PRISM	82	//SiTera Prism

//e_version 
#define EV_NONE		0	//Invalid version 
#define EV_CURRENT	1	//Current version 



typedef struct
{
        unsigned char   e_ident[EI_NIDENT];
        Elf32_Half      e_type;
        Elf32_Half      e_machine;
        Elf32_Word      e_version;
        Elf32_Addr      e_entry;
        Elf32_Off       e_phoff;
        Elf32_Off       e_shoff;
        Elf32_Word      e_flags;
        Elf32_Half      e_ehsize;
        Elf32_Half      e_phentsize;
        Elf32_Half      e_phnum;
        Elf32_Half      e_shentsize;
        Elf32_Half      e_shnum;
        Elf32_Half      e_shstrndx;
}Elf32_Ehdr;


//Special Section Indexes 
#define	SHN_UNDEF	0
#define	SHN_LORESERVE	0xff00
#define	SHN_LOPROC	0xff00
#define	SHN_HIPROC	0xff1f
#define	SHN_LOOS	0xff20
#define	SHN_HIOS	0xff3f
#define	SHN_ABS		0xfff1
#define	SHN_COMMON	0xfff2
#define	SHN_XINDEX	0xffff
#define	SHN_HIRESERVE	0xffff

//sh_type
#define	SHT_NULL	0
#define	SHT_PROGBITS	1
#define	SHT_SYMTAB	2
#define	SHT_STRTAB	3
#define	SHT_RELA	4
#define	SHT_HASH	5
#define	SHT_DYNAMIC	6
#define	SHT_NOTE	7
#define	SHT_NOBITS	8
#define	SHT_REL		9
#define	SHT_SHLIB	10
#define	SHT_DYNSYM 	11
#define	SHT_INIT_ARRAY	14
#define	SHT_FINI_ARRAY	15
#define	SHT_PREINIT_ARRAY 16
#define	SHT_GROUP	17
#define	SHT_SYMTAB_SHNDX 18
#define	SHT_LOOS	0x60000000
#define	SHT_HIOS	0x6fffffff
#define	SHT_LOPROC	0x70000000
#define	SHT_HIPROC	0x7fffffff
#define	SHT_LOUSER	0x80000000
#define	SHT_HIUSER	0xffffffff

//sh_flags
#define	SHF_WRITE	0x1 
#define	SHF_ALLOC	0x2 
#define	SHF_EXECINSTR	0x4 
#define	SHF_MERGE	0x10 
#define	SHF_STRINGS	0x20 
#define	SHF_INFO_LINK	0x40 
#define	SHF_LINK_ORDER	0x80 
#define	SHF_OS_NONCONFORMING 0x100 
#define	SHF_GROUP	0x200 
#define	SHF_MASKOS	0x0ff00000 
#define	SHF_MASKPROC	0xf0000000 

typedef struct 
{
	Elf32_Word	sh_name;
	Elf32_Word	sh_type;
	Elf32_Word	sh_flags;
	Elf32_Addr	sh_addr;
	Elf32_Off	sh_offset;
	Elf32_Word	sh_size;
	Elf32_Word	sh_link;
	Elf32_Word	sh_info;
	Elf32_Word	sh_addralign;
	Elf32_Word	sh_entsize;
}Elf32_Shdr;


typedef struct {
	Elf32_Word	p_type;
	Elf32_Off	p_offset;
	Elf32_Addr	p_vaddr;
	Elf32_Addr	p_paddr;
	Elf32_Word	p_filesz;
	Elf32_Word	p_memsz;
	Elf32_Word	p_flags;
	Elf32_Word	p_align;
} Elf32_Phdr;


